const ws = require('nodejs-websocket');
const PORT = 3001;
const ON_STATUS = 0;
const SEND_STATUS = 1;
const LEAVE_STATUS = 2;

// 当前用户数量
let count = 0;

// 消息结构 {msg:'xxx',type:0,time:时间戳}
// type:0:用户进入,type:1:用户发送消息,type:2: 用户离开


// 只要有用户连接，就会给用户创建一个connect对象
const server = ws.createServer(con =>{
    // console.log('新用户连接上线');

    count++;
    con.username = `用户${count}`
    //1.当有人进入聊天室，需要告诉所有人

    broadcast( {
        type:ON_STATUS,
        msg:`${con.username}进入了聊天室`,
        time:new Date().toLocaleTimeString()
    })


    // 用户send数据就会触发text事件
    con.on('text',data=>{
        console.log('用户发送的数据:'+data);
        // 将数据发送给用户
        // 3. 当有人发送消息时，需要发送给所有人
        // con.send(): 发送给当前用户
        //con.send(data)

        // 发送给所有用户
        // broadcast(data)
        broadcast({
            type:SEND_STATUS,
            msg:`${con.username}:${data}`,
            time:new Date().toLocaleTimeString()
        })

    })


    // 连接断开
    con.on('close',()=>{
        // console.log('连接断开了');
        count--;
        // 2. 当有人离开聊天室，需要告诉所有人
      //  broadcast(`${con.username}离开了聊天室`)
      broadcast( {
        type:LEAVE_STATUS,
        msg:`${con.username}离开了聊天室`,
        time:new Date().toLocaleTimeString()
    })


    })

    // 注册异常监听，如何不注册，出现异常程序会停止
    con.on('error',()=>{
        console.log('用户连接出现异常');
    })
})


// 实现广播功能
function broadcast(msg){
    //server.connections: 获取服务的所有连接
    // send() 发送字符串
    server.connections.forEach(item=> item.send(JSON.stringify(msg)))
}

server.listen(PORT,()=>{
    console.log('http://localhost:3001');
})
